import json
import os

CONFIG_FILE = "config.json"
PROMPTS_DIR = "prompts"

def load_config() -> dict:
    """加载 config.json 配置文件"""
    if not os.path.exists(CONFIG_FILE):
        raise FileNotFoundError(f"配置文件 {CONFIG_FILE} 未找到。")
    with open(CONFIG_FILE, 'r', encoding='utf-8') as f:
        return json.load(f)

def get_active_prompt(task_name: str) -> str:
    """
    根据任务名称从配置中加载并返回当前激活的提示词内容。

    参数:
        task_name (str): 任务名称，对应 config.json 中 active_prompts 的键。
                         例如："book_title", "plot_direction", "content_generation"

    返回:
        str: 激活的提示词文件内容。

    异常:
        ValueError: 如果配置无效或无法找到提示词文件。
        FileNotFoundError: 如果配置文件或提示词文件未找到。
    """
    config = load_config()

    active_prompts_config = config.get("active_prompts", {})
    active_prompt_key = active_prompts_config.get(task_name)
    if not active_prompt_key:
        raise ValueError(f"任务 \"{task_name}\" 在 config.json 的 active_prompts 中没有找到对应的激活提示词配置。")

    prompt_sets_config = config.get("prompt_sets", {})
    task_prompt_sets = prompt_sets_config.get(task_name)
    if not task_prompt_sets:
        raise ValueError(f"任务 \"{task_name}\" 在 config.json 的 prompt_sets 中没有找到任何提示词集。")

    prompt_file_relative_path = task_prompt_sets.get(active_prompt_key)
    if not prompt_file_relative_path:
        raise ValueError(f"为任务 \"{task_name}\" 配置的激活提示词键 \"{active_prompt_key}\" 在 prompt_sets 中没有找到对应的文件路径。")

    # 确保路径是相对于项目根目录的，即使config中的路径已经是这样
    # prompt_file_path = os.path.join(os.path.dirname(__file__), PROMPTS_DIR, task_name, f"{active_prompt_key}.txt") 
    # 上面的方式假定了固定的文件名结构，我们直接使用config中定义的完整相对路径
    prompt_file_path = os.path.abspath(prompt_file_relative_path)

    if not os.path.exists(prompt_file_path):
        raise FileNotFoundError(f"提示词文件未找到：{prompt_file_path} (配置路径: {prompt_file_relative_path})。请检查 config.json 中的路径是否正确，并确保文件存在。")

    with open(prompt_file_path, 'r', encoding='utf-8') as f:
        return f.read()

if __name__ == '__main__':
    # 测试代码
    print("测试 Prompt 管理器...")
    try:
        print("\n尝试获取 'book_title' 任务的激活提示词:")
        prompt_book = get_active_prompt("book_title")
        print(f"成功加载提示词 (部分预览):\n{prompt_book[:150]}...")
        
        print("\n尝试获取 'plot_direction' 任务的激活提示词:")
        prompt_plot = get_active_prompt("plot_direction")
        print(f"成功加载提示词 (部分预览):\n{prompt_plot[:150]}...")
        
        print("\n尝试获取 'content_generation' 任务的激活提示词:")
        prompt_content = get_active_prompt("content_generation")
        print(f"成功加载提示词 (部分预览):\n{prompt_content[:150]}...")

        # 示例：如何添加并切换到新提示词 (手动操作)
        # 1. 在 prompts/book_title/ 下创建 new_book_prompt.txt
        # 2. 修改 config.json:
        #    "prompt_sets": {
        #        "book_title": {
        #            "default_v1": "prompts/book_title/default_v1.txt",
        #            "new_version": "prompts/book_title/new_book_prompt.txt"
        #        }
        #    ...
        #    "active_prompts": {
        #        "book_title": "new_version",
        #    ...
        # print("\n假设已切换 'book_title' 到新版本，重新加载:")
        # prompt_book_new = get_active_prompt("book_title")
        # print(f"成功加载新提示词 (部分预览):\n{prompt_book_new[:100]}...")

    except Exception as e:
        print(f"测试过程中发生错误: {e}") 